Thread: [SOCKETS] Solaris server in C, NT client in VB

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User
    Join Date
    May 2002
    Posts
    2

    [SOCKETS] Solaris server in C, NT client in VB

    Warning! C/sockets newbie ahead!

    I seem to be having some issues here trying to get these 2 apps to communicate. I'm getting a weird behavior issue but I don't know if it's server side or client side. The client is a simple VB app with a few buttons to connect, send, and disconnect. It sends test in one textbox and receives it in another. That works fine. The problem is that after the winsock.sendata method is called on the client, the tcpClient.state becomes 8 ("Peer is closing the connection"). I'm not sure why this happens. I thought it might be the close( new_fd ) line in the server code but it happens even with that line commented out. The server code is modified Beej code (Thanks Beej!). I took out the fork just to make it a little easier for me to follow what is happening. The problem happens in both versions though. Here is the server code, the client code is all of about 10 lines and not really worth posting on a C board. Yes, I know I should just use a C client but I don't have a compiler I can use at the moment.

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/wait.h>
    #include <signal.h>

    #define MYPORT 60000 // the port users will be connecting to

    #define BACKLOG 10 // how many pending connections queue will hold

    #define MAXDATASIZE 100 // max number of bytes we can get at once

    void sigchld_handler( int s )
    {
    while( wait( NULL ) > 0 );
    }

    int main( void )
    {
    /* BEGIN FUNCTION PROTOTYPES */
    void checksystem( );
    /* END FUNCTION PROTOTYPES */

    int numbytes, fd[ 2 ];
    char buf[ MAXDATASIZE ];

    int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
    struct sockaddr_in my_addr; // my address information
    struct sockaddr_in their_addr; // connector's address information
    int sin_size;
    struct sigaction sa;
    int yes = 1;

    if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
    {
    perror( "socket" );
    exit( 1 );
    }

    if( setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( int ) ) == -1 )
    {
    perror( "setsockopt" );
    exit( 1 );
    }

    my_addr.sin_family = AF_INET; // host byte order
    my_addr.sin_port = htons( MYPORT ); // short, network byte order
    my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
    memset( &( my_addr.sin_zero ), '\0', 8 ); // zero the rest of the struct

    if( bind( sockfd, ( struct sockaddr * )&my_addr, sizeof( struct sockaddr ) ) == -1 )
    {
    perror( "bind" );
    exit( 1 );
    }

    if( listen( sockfd, BACKLOG ) == -1 )
    {
    perror( "listen" );
    exit( 1 );
    }

    sa.sa_handler = sigchld_handler; // reap all dead processes
    sigemptyset( &sa.sa_mask );
    sa.sa_flags = SA_RESTART;
    if( sigaction( SIGCHLD, &sa, NULL ) == -1 )
    {
    perror( "sigaction" );
    exit( 1 );
    }

    while( 1 )
    { // main accept() loop
    sin_size = sizeof( struct sockaddr_in );
    if( ( new_fd = accept( sockfd, ( struct sockaddr * )&their_addr, &sin_size ) ) == -1 )
    {
    perror( "accept" );
    continue;
    }

    printf( "server: got connection from %s\n", inet_ntoa( their_addr.sin_addr ) );
    printf( "server: new_fd = %d\n", new_fd );

    if( ( numbytes = recv( new_fd, buf, MAXDATASIZE-1, 0 ) ) == -1 ) {
    perror( "recv" );
    exit( 1 );
    }
    buf[ numbytes ] = '\0';
    if( strcmp( buf, "testmatch" ) == 0 )
    {
    if( send( new_fd, "They matched!\n" , 14, 0 ) == -1 )
    perror( "send" );
    /*checksystem( );*/
    }

    if( send( new_fd, buf, 14, 0 ) == -1 )
    perror( "send" );
    close( new_fd );
    }

    return 0;
    }

    void checksystem( )
    {
    //forked process....
    }
    Last edited by Daveg27; 05-23-2002 at 08:26 AM.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. server client application - (i really need your help)
    By sarahnetworking in forum C Programming
    Replies: 3
    Last Post: 03-01-2008, 10:54 PM
  2. Socket Programming Problem!!!!
    By bobthebullet990 in forum Networking/Device Communication
    Replies: 2
    Last Post: 02-21-2008, 07:36 PM
  3. Where's the EPIPE signal?
    By marc.andrysco in forum Networking/Device Communication
    Replies: 0
    Last Post: 12-23-2006, 08:04 PM
  4. Unicode vurses Non Unicode client server application with winsock2 query?
    By dp_76 in forum Networking/Device Communication
    Replies: 0
    Last Post: 05-16-2005, 07:26 AM
  5. socket question
    By Unregistered in forum C Programming
    Replies: 3
    Last Post: 07-19-2002, 01:54 PM